package example.p1;

// https://www.runoob.com/w3cnote/java-protected-keyword-detailed-explanation.html

import example.p2.Son2;

/**
 * 结论: 'clone()' has protected access in 'java.lang.Object'
 * 'xx方法' has protected access in 'xx类'
 * 这是一个编译期间的错误.主要看等号左边的类,看其中protected方法来自于哪里.
 * 如果是多态,则看其父类中protected方法.
 * 如果是不是多态,则看左边对象本身的protected方法.
 * 1.子类有覆写:决定权在子类的protected方法
 * 2.子类无覆写:决定权在父类类的protected方法
 * <p>
 * 多态的编译法则:
 * 允许当前类的对象找到父中protected方法.其它兄弟类不行.
 */
public class Test extends Son1 {

//        @Override
//    protected void fun() {
//        System.out.println("Test fun is running");
//    }

    public static void main(String[] args) throws Exception {
        Son1 son1 = new Son1();
//        Father1 son1 = new Son1();
        son1.fun(); // Compile OK      ----（1）
//        son1.clone(); // Compile Error     ----（2）

        new Test().fun();
        new Test().clone();//因为当前Test类中有继承来的clone方法,所以不报错

        Son1 test = new Test();
//        Test test = new Test();
//        test.fun();
//        test.clone();

        Test test1 = new Test();
        test1.clone(); // Compile OK

        Object test2 = new Test();
//        test2.clone();

//        son1.cloneOverride();


        Son2 son2 = new Son2();
//        Father1 son2 = new Son2();
//        son2.fun(); // Compile OK     ----（3）
//        son2.clone(); // Compile Error     ----（4）
    }
}
